package bytecode;
/*
基于栈的解释器的执行过程概念模型 BasicStackExecutionProcess
现代JVM在执行Java代码的时候，通常都会将解释执行与编译执行二者结合起来进行。
所谓解释执行，就是通过解释器来读取字节码，遇到相应的指令就去执行该指令。
所谓编译执行，就是通过即时编译器(Just In Time, JIT) 将字节码转换为本地机器码来执行;现代JVM会根据代码热点来生成
相应的本地机器码。
基于栈的指令集与基于寄存器的指令集之间的关系:
1.JVM执行指令时所采取的方式是基于栈的指令集。
2.基于栈的指令集主要的操作有入栈与出栈两种。
3.基于栈的指令集的优势在于它可以在不同平台之间移植，而基于寄存器的指令集是与硬件架构紧密关联的，无法做到可移植。
4.基于栈的指令集的缺点在于完成相同的操作，指令数量通常要比基于寄存器的指令集数量要多;基于栈的指令集是在内存中完成操作的,
而基于寄存器的指令集是直接由CPU来执行的，它是在高速缓冲区中进行执行的，速度要快很多。虽然虚拟机可以采用一-些优化手段，
但总体来说，基于栈的指令集的执行速度要慢一些。



 */
public class MyTest8 {
    public int calc() {
        int a = 100;
        int b = 400;
        int c = 300;
        return (a - b) * c;

        /*

  public int calc();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: bipush        100       执行地址偏移量为0 将100推送至栈顶
         2: istore_1                执行地址偏移量为2  将栈顶的100出栈并存放到第一个局部变量Slot中
         3: sipush        400
         6: istore_2
         7: sipush        300
        10: istore_3
        11: iload_1                 执行地址偏移量为11 将局部变量中第一个Slot中的整型值复制到栈顶
        12: iload_2
        13: isub                    将栈顶的两个元素出栈并作整型减法，然后把结果重新入栈
        14: iload_3
        15: imul                    将栈顶的两个元素出栈并作整形乘法，然后把结果重新入栈
        16: ireturn                 结束方法并将栈顶的值返回给方法调用者
      LineNumberTable:
        line 21: 0
        line 22: 3
        line 23: 7
        line 24: 11
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      17     0  this   Lbytecode/MyTest8;
            3      14     1     a   I
            7      10     2     b   I
           11       6     3     c   I




         */
    }

    public static void main(String[] args) {
        MyTest8 process = new MyTest8();
        int res = process.calc();
        System.out.println(res);
    }
}
